如何使用 OkHttp3 实现 Android 的 WebSocket 多客户端通信 |
您所在的位置:网站首页 › websocket android › 如何使用 OkHttp3 实现 Android 的 WebSocket 多客户端通信 |
public class WebSocketUtil {
private static final int NORMAL_CLOSURE_STATUS = 1000;
private final OkHttpClient client = new OkHttpClient();
private WebSocket socket;
private WebSocketListener listener;
private Map webSockets = new ConcurrentHashMap();
public void connect(String url) {
Request request = new Request.Builder().url(url).build();
listener = new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {
}
@Override
public void onMessage(WebSocket webSocket, String text) {
// 接收到服务端发来的消息
Log.d("WebSocket", "onMessage: " + text);
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
// 接收到服务端发来的消息
Log.d("WebSocket", "onMessage: " + bytes.toString());
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
webSocket.close(NORMAL_CLOSURE_STATUS, null);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
Log.e("WebSocket", "onFailure", t);
}
};
socket = client.newWebSocket(request, listener);
}
public void send(String message, String targetClientId) {
if (!TextUtils.isEmpty(targetClientId)) {
// 向指定客户端发送消息
WebSocket targetSocket = webSockets.get(targetClientId);
if (targetSocket != null) {
targetSocket.send(message);
}
} else {
// 向所有客户端发送消息
socket.send(message);
}
}
public void disconnect() {
if (socket != null) {
socket.close(NORMAL_CLOSURE_STATUS, null);
}
client.dispatcher().executorService().shutdown();
}
public void addWebSocket(String clientId, WebSocket webSocket) {
webSockets.put(clientId, webSocket);
}
public void removeWebSocket(String clientId) {
webSockets.remove(clientId);
}
}
在上面的代码中,我们在 WebSocketUtil 类中封装了几个方法,分别用于连接 WebSocket 服务器、向客户端发送消息、断开连接等。其中,我们使用了 ConcurrentHashMap 来存储多个客户端的 WebSocket 连接,以支持向特定客户端发送消息。 以下是一个使用示例: // 连接 WebSocket 服务器 WebSocketUtil webSocketUtil = new WebSocketUtil(); webSocketUtil.connect("ws://10.0.0.2:8080"); // 发送消息 webSocketUtil.send("hello, world!", null); // 向所有客户端发送消息 String targetClientId = "abcde"; // 指定某个客户端 webSocketUtil.send("hello, client!", targetClientId); // 向特定客户端发送消息 // 在 WebSocket 连接中添加新的客户端 WebSocket ws = ... // 新的 WebSocket 连接 String clientId = "12345"; // 客户端的 ID webSocketUtil.addWebSocket(clientId, ws); // 从 WebSocket 连接中移除客户端 webSocketUtil.removeWebSocket(clientId); // 断开 WebSocket 连接 webSocketUtil.disconnect();在上面的代码中,我们首先调用 WebSocketUtil 中的 connect() 方法来连接 WebSocket 服务器。在连接成功后,我们可以使用 send() 方法向客户端发送消息,包括向所有客户端或向特定客户端发送。在服务端接收到消息时,会分别触发 onMessage() 回调,你可以在回调中处理接收到的消息。 此外,我们还实现了 addWebSocket() 方法和 removeWebSocket() 方法,以便在 WebSocket 连接中添加新的客户端并移除已连接的客户端,以满足客户端上下线的需求。 这个工具类能够支持 WebSocket 发送和接收各种类型的数据,例如 String、ByteString 等,你可以在 onMessage() 回调中对不同类型的数据进行不同的处理,以满足你的需求。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |